package log

import (
	"io"
	"os"
	"time"
)

/* //* 日志系统初始化实现，根据配置创建日志记录器，支持多输出目标（标准输出和文件），设置日志级别 */

const LOG_PRIFIX = "RUNE"

/*
创建日志初始化函数
*/

// 根据配置初始化日志系统
func InitFromConfig(logConfig *LogConfig) error {
	// 设置日志等级
	level := parseLevel(logConfig.Level)
	SetLevel(level)
	// 设施之日志输出
	var writers []io.Writer
	if logConfig.Output == "stdout" || logConfig.Output == "both" {
		writers = append(writers, os.Stdout)
	}
	if logConfig.Output == "filesource" || logConfig.Output == "both" {
		// 计算最大年龄
		maxAge := time.Duration(logConfig.MaxAge) * 24 * time.Hour
		fileWriter, err := NewFileWriter(
			logConfig.FilePath,
			int64(logConfig.MaxSize),
			maxAge,
			logConfig.MaxBackups,
		)

		//fileLogger, err := NewFileLogger(level, logConfig.FilePath)

		if err != nil {
			return err
		}
		// 实现了 io.Writer
		writers = append(writers, fileWriter)
	}
	if len(writers) == 0 {
		writers = append(writers, os.Stdout)
	}
	// 设置输出  设置多重输出，可以输出到文件中，标准输出上
	//SetOutput(io.MultiWriter(writers...))

	multiWriter := io.MultiWriter(writers...)
	logger := GetLogger("default")
	if stdLogger, ok := logger.(*StdLogger); ok {
		stdLogger.SetOutput(multiWriter)
		stdLogger.SetLevel(level)
	} else {
		// 如果默认记录器不是StdLogger,创建一个新的设置默认
		newLogger := NewStdLogger(level)
		newLogger.SetOutput(multiWriter)
		SetLogger("default", newLogger)
	}

	// 记录初始化信息
	Infof("Log system initialized: level=%s, output=%s, filesource=%s",
		level.String(), logConfig.Output, logConfig.FilePath)
	return nil
}

// parseLevel 解析日志级别字符串
func parseLevel(levelStr string) Level {
	switch levelStr {
	case "debug":
		return LevelDebug
	case "info":
		return LevelInfo
	case "warn":
		return LevelWarn
	case "error":
		return LevelError
	case "fatal":
		return LevelFatal
	default:
		return LevelInfo
	}
}
